package PhaseoneModulethree.TheFifthQuestion.code;
/*
*  使用集合实现斗地主游戏的部分功能，要求如下：
 （1）首先准备 54 张扑克牌并打乱顺序。
 （2）由三个玩家交替摸牌，每人 17 张扑克牌，最后三张留作底牌。
 （3）查看三个玩家手中的扑克牌和底牌。
 （4）其中玩家手中的扑克牌需要按照大小顺序打印，规则如下：
    手中扑克牌从大到小的摆放顺序：大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
* */
import java.util.*;

public class TheFifthQuestion {

    // 声明一个按牌大小排好的集合
    private static List<String> cardOrder = Arrays.asList("3", "4", "5", "6", "7", "8", "9",
            "10","J", "Q", "K", "A", "2", "小王", "大王");
    // 声明一个拥有所有牌的集合
    private static List<String> allCard = new ArrayList<>(
            Arrays.asList("3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2",
                    "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2",
                    "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2",
                    "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2",
                    "小王", "大王"));

    // 洗牌
    public static Queue<String> shuffleCard(){
        /*方式一
        // 创建随机数对象
        Random random = new Random();
        // 声明一个存储洗完后牌的集合
        Queue<String> newAllCard = new LinkedList<>();
        // 循环54次，随机从集合allCard中取牌并放入集合newAllCard中
        for(int i = 54; i >= 1; i--){
            // 获取随机数, 用于当做从集合allCard中获取元素的索引
            int index = random.nextInt(i);
            // 将随机获取的元素放入集合newAllCard中
            newAllCard.offer(allCard.get(index));
            // 移除集合allCard中的被取走的元素，防止被重复获取
            allCard.remove(index);

        }*/
        // 方式二
        // 使用集合工具类Collections的随机置换洗牌
        Collections.shuffle(allCard);
        return new LinkedList<>(allCard);
    }

    // 玩家摸牌
    public static void getCard(Queue<String> newAllCard, Queue<String> person1,
                               Queue<String> person2, Queue<String> person3){
        // 每人17张，所以循环17次，按玩家顺序依次从队列顶部摸牌
        for(int i = 0; i < 17; i++){
            person1.offer(newAllCard.poll()); // 从洗好的牌中摸一张牌放入玩家1中
            person2.offer(newAllCard.poll());
            person3.offer(newAllCard.poll());
        }
    }

    // 牌排序
    public static void sortCard(Queue<String> person){
        // 声明一个一维数组用于存储玩家的每张牌在排好序的集合cardOrder中的索引
        int[] sortNum = new int[17];
        // 获取玩家牌的张数
        int len = person.size();
        // 循环查找每张牌在cardOrder中的索引放入数组sortNum中
        for(int i = 0; i < len; i++){
            int index = cardOrder.indexOf(person.poll());
            sortNum[i] = index;
        }
        // 对数组sortNum中的索引进行正排序，排好的索引也就是牌大小的顺序
        Arrays.sort(sortNum);
        // 用排好的数组中的索引，依次去集合cardOrder中获取牌并放入玩家的集合中
        for(int i = sortNum.length -1; i >= 0; i--){
            person.offer(cardOrder.get(sortNum[i]));
        }
    }

    // 程序入口
    public static void main(String[] args){

        // 声明玩家集合，用来存储牌
        Queue<String> person1 = new LinkedList<>();
        Queue<String> person2 = new LinkedList<>();
        Queue<String> person3 = new LinkedList<>();
        // 洗牌
        Queue<String> newAllCard = shuffleCard();
        // 玩家摸牌
        getCard(newAllCard, person1, person2,person3);
        // 对玩家的牌进行排序
        sortCard(person1);
        sortCard(person2);
        sortCard(person3);
        // 打印玩家的牌和底牌
        System.out.println("玩家1号的牌为：" + person1);
        System.out.println("玩家2号的牌为：" + person2);
        System.out.println("玩家3号的牌为：" + person3);
        System.out.println("底牌牌为：" + newAllCard);

    }
}

